青云算法面试题干货-开密码锁-LeetCode第752题

问题:给你一个包含四个环形转轮的密码锁,每个转轮上10个格子对应从'0'到'9'的10个数字。这些转轮可以向两个方向自由转动,也就是可以从'0'转到'9',也可以从'9'转到'0'。每一步你只可以转一个转轮一格。这个密码锁还有一些死锁状态(输入的deadends),当四个转轮的密码转入这些状态时这个锁就再也打不开了。假设这个锁的初始状态是"0000",给你一个目标状态target,请问你至少需要多少步才能够打开?如果不可能打开该密码锁,则输出-1。

例如,输入死锁状态deadends为数组["0201", "0101", "0102", "1212", "2002"],目标状态target为"0202",则至少需要6步从最初的"0000"转到"0202"。其中一个可能的步骤序列为"0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。注意序列"0000" -> "0001" -> "0002" -> "0102" -> "0202"尽管更短只有4步,但由于中间有个死锁状态"0102",因此这是一个无效的开锁步骤。

分析:这是LeetCode第752题。

解法一:广度优先搜索

密码锁由四个转轮上的数字组成密码锁的状态,同时我们可以把转动密码锁看成是密码锁状态的改变。一般而言如果一个问题是某事物状态的改变,那么我们可以考虑把问题转换成图搜索的问题。

我们解决图的问题的第一步就是找出问题对应的图(Graph)。由于图是顶点和边的集合,因此找图的关键是找出图的顶点和边。对于这个问题,密码锁的每一个状态都对应着图上的一个顶点。比如状态"0000"是一个顶点,"0001"是另一个顶点。 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值